package com.ruoyi.project.WxMoudle.WebSocket;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

//component的注释使server注入spring容器
//@ServerEndpoint(value = "/webSocket/{userId}", configurator = WebSocketEndpointConfigure.class)
//这里原本是上面的注释，但是引入WebSocketEndpointConfigure的class报错，所以暂时注释，同样不影响使用，同上面配置类
//里面被注释的是一体的
//serverEndpoint注释中的值代表这接口路径，采用了RESTfull风格
@Component
@ServerEndpoint(value = "/api/webSocket/{userId}")
public class WebSocketServer {
    //ConcurrentHashMap 用来存放每个客户端的对应的WebSocketServer对象
    private static ConcurrentHashMap<String, Session> webSocketSet = new ConcurrentHashMap<>();
    private Logger logger =LoggerFactory.getLogger(WebSocketServer.class);


    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") String userId) {
        //这里以userId作为key存储客户端和后台端通道的一个标识，存入ConcurrentHashMap<String, Session>中
        webSocketSet.put(userId, session);//建立通道缓存信息
        //相关业务处理，根据拿到的用户ID判断其为那种角色，根据角色ID去查询是否有需要推送给该角色的消息，有则推送
        System.out.println("******************一下写创建通道后的逻辑代码*************************************************");
        System.out.println("用户id为" + userId+"建立websocket成功");
        System.out.println("******************以上写创建通道后的逻辑代码*************************************************");
//        List<String> totalPushMsgs = new ArrayList<String>();
//        totalPushMsgs.add("用户id为" + userId+"建立websocket成功");
//        if (totalPushMsgs != null && !totalPushMsgs.isEmpty()) {
//            totalPushMsgs.forEach(e -> sendMessage(userId, e));
//        }
    }

    /**
     * 发送消息
     */
    public void sendMessage(String userId,String message){
        try {
            Session currentSession=webSocketSet.get(userId);
            if (currentSession!=null&&currentSession.isOpen()){
                currentSession.getBasicRemote().sendText(message);
            }
            logger.info("推送消息成功，消息为："+message);
        }catch (IOException e){

        }
    }

    /**
     * 自定义消息
     */
    public static void sendInfo(String userId,String message) throws IOException {
        Session currentSession=webSocketSet.get(userId);
        if (currentSession!=null&&currentSession.isOpen()){
            currentSession.getBasicRemote().sendText(message);
        }
    }

    /**
     * 用户退出时，链接关闭调用的方法
     */
    public static void onCloseConection(String userId){
        webSocketSet.remove(userId);
    }

    /**
     * 链接关闭调用的方法
     */
    @OnClose
    public void onClose(){
        System.out.println("用户socket关闭成功");
        logger.info("一个客户端关闭链接");
    }

    /**
     * 发生错误时调用
     */
    @OnError
    public void onError(Session session, Throwable error) {
        System.out.println("用户socket报错");
        logger.error("webSocket出现错误");
    }

    /**
     * 收到客户端消息后调用的方法
     */
//    public void onMessage(String message,Session session){
//
//    }
    /**
     * 给所有人发消息
     *
     * @param message
     */
    public void sendAll(String message) {
        String sendMessage = message.split("[|]")[0];
        //遍历HashMap
        for (String key : webSocketSet.keySet()) {
            this.sendMessage(key,sendMessage);
        }
    }

}

